#ifndef VECTORS_H
#define VECTORS_H

#include <iostream>
#include <math.h>
#include <stdlib.h>

#define PI 3.14159265

namespace me
{


    class Vector2i
    {
        public:
            Vector2i(int nx = 0, int ny = 0);
            virtual ~Vector2i();

            me::Vector2i& operator+=(me::Vector2i const& b);
            me::Vector2i& operator-=(me::Vector2i const& b);
            me::Vector2i& operator*=(int const& b);

            double getLength();
            float getOrientation();

            int x;
            int y;
        protected:
        private:
    };



    class Vector2u
    {
        public:
            Vector2u(unsigned int nx = 0, unsigned int ny = 0);
            virtual ~Vector2u();

            me::Vector2u& operator+=(me::Vector2u const& b);
            me::Vector2u& operator-=(me::Vector2u const& b);
            me::Vector2u& operator*=(unsigned int const& b);

            double getLength();
            float getOrientation();

            unsigned int x;
            unsigned int y;
        protected:
        private:
    };



    class Vector2f
    {
        public:
            Vector2f(float nx = 0, float ny = 0);
            virtual ~Vector2f();

            me::Vector2f& operator+=(me::Vector2f const& b);
            me::Vector2f& operator-=(me::Vector2f const& b);
            me::Vector2f& operator*=(float const& b);

            double getLength();
            float getOrientation();

            float x;
            float y;
        protected:
        private:
    };




}

me::Vector2i operator+(me::Vector2i const& a, me::Vector2i const& b);
me::Vector2i operator-(me::Vector2i const& a, me::Vector2i const& b);
int operator*(me::Vector2i const& a, me::Vector2i const& b);

me::Vector2u operator+(me::Vector2u const& a, me::Vector2u const& b);
me::Vector2u operator-(me::Vector2u const& a, me::Vector2u const& b);
unsigned int operator*(me::Vector2u const& a, me::Vector2u const& b);

me::Vector2f operator+(me::Vector2f const& a, me::Vector2f const& b);
me::Vector2f operator-(me::Vector2f const& a, me::Vector2f const& b);
float operator*(me::Vector2f const& a, me::Vector2f const& b);


std::ostream& operator<<(std::ostream& flux, me::Vector2f const& a);
std::ostream& operator<<(std::ostream& flux, me::Vector2i const& a);
std::ostream& operator<<(std::ostream& flux, me::Vector2u const& a);


#endif // VECTORS_H
